Dynamische Vorschlagssuche

Seit SAP Release 7.40 gibt es in der F4-Suchhilfe die erweiterte Option “Vorschlagssuche auf Eingabefeldern”. Im englischen wird es auch type-ahead oder proposal search genannt. Sie zeigt dem Anwender sofort nach Eingabe eines Zeichens in das Eingabefeld mögliche Treffer an. Je nach Datenbank kann in der Suchhilfe auch die Spaltenübergreifende Volltextsuche (fuzzy search) aktiviert werden.

Die Vorschlagssuche wird in den gängigsten SAP-Transaktionen verwendet.

Vorschlagssuche in Transaktion SE24

Einstellung im SAPGUI

Man kann die Vorschlagssuche in den SAPGUI-Optionen abschalten, denn die Verwendung ist manchmal problematisch. So wird die Ergebnismenge zu langsam eingeblendet oder das eingegebene Wort kommt als auch die Suche kommen durcheinander, wenn man das Wort zu schnell editiert.

Folgende Einstellung im SAPGUI steuert die Verwendung der Vorschlagssuche:

Aktivierte Vorschlagssuche im SAPGUI

Eigene Vorschlagsliste

In der Regel basieren die Einträge auf der der Suchhilfe zu Grunde liegenden Selektionsmethode. Ich zeige dir eine Methode, wie du die Vorschlagssuche für eine dynamisch zusammengestellte Liste. In meinem Beispiel habe ich die 30 größten deutschen Städte sowie deren Bundesländer ermittelt. Aus diesen Städten soll sich der Anwender eine Stadt auswählen:

Einfaches Eingabefeld

Was musst du tun, um die dynamische Vorschlagssuche zu realisieren? du benötigst im Grunde nur einen Suchhilfe-Exit, der die folgenden Dinge tut:

  • Ermittlung der gültigen Werte
  • Einschränkung der Werte
  • Zurückstellen der in Frage kommenden Werte in die Trefferliste

Die Frage ist natürlich, wie kommen die in Frage kommenden Werte in die Suchhilfe? Der mir einfachste Weg ist der Austausch über das SAP-Memory. Die Daten werden vom Programm per EXPORT TO MEMORY in den Speicher geschrieben und von der Suchhilfe mit IMPORT FROM MEMORY wieder ausgelesen.

Suchhilfe-Exit

Ein Suchhilfe-Exit greift bei den verschiedenen Aktionen der Suchhilfe-Verarbeitung ein. Lege eine neue Funktionsgruppe an und kopiere den Baustein F4IF_SHLP_EXIT_EXAMPLE auf einen Namen deiner Wahl. Ich habe den Baustein Z_SHLP_EXIT_DYNAMIC genannt.

Bei der Ausführung der F4-Wertsuchhilfe werden mehrere Verarbeitungsschritte durchlaufen. Der Funktionsbaustein wird bei jedem dieser Schritte aufgerufen. Was im jeweiligen Schritt getan werden muss, muss über den Eingabeparameter CALLCONTROL-STEP gesteuert werden.

Der Verarbeitungsschritt, der wohl am häufigsten verwendet wird, ist “SELECT”. Auch wir nutzen diesen Schritt, um die Werteliste zu ermitteln und zur Verfügung zu stellen.

Funktionsbaustein Z_SHLP_EXIT_DYNAMIC

Im folgenden Coding importiere ich die Werteliste, die vom Programm per SAP-Memory übergeben wurden. Danach lese ich den Wert, den der Anwender bereits eingegeben hat und prüfe damit die einzelnen Einträge. Die Werte, die nicht passen, lösche ich aus der Tabelle.

Die am Ende verbleibenden Werte werden Spaltenweise mit dem Funktionsbaustein F4UT_PARAMETER_RESULTS_PUT an die Ergebnistabelle übertragen.

FUNCTION Z_SHLP_EXIT_DYNAMIC .
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     REFERENCE(SHLP) TYPE  SHLP_DESCR
*"     REFERENCE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------

  TYPES: BEGIN OF ts_value,
           line TYPE text40,
           text TYPE text40,
         END OF ts_value.
  DATA values TYPE STANDARD TABLE OF ts_value WITH EMPTY KEY.


  IF callcontrol-step = 'SELECT'.

    IMPORT values TO values FROM MEMORY ID 'Trcktrsr'.

    DATA(selval) = to_upper( shlp-interface[ shlpfield = 'VALUE' ]-value ).


    LOOP AT values ASSIGNING FIELD-SYMBOL(<val>).
      DATA(val) = to_upper( <val>-line ).
      IF NOT val CP selval.
        DELETE values INDEX sy-tabix.
      ENDIF.
    ENDLOOP.

    CALL FUNCTION 'F4UT_PARAMETER_RESULTS_PUT'
      EXPORTING
        parameter         = 'VALUE'
        fieldname         = 'LINE'         " Name of the source field in SOURCE_TAB
      TABLES
        shlp_tab          = shlp_tab    " Table of Elementary Search Helps
        record_tab        = record_tab  " Hit list
        source_tab        = values
      CHANGING
        shlp              = shlp        " Single (Current) Search Help
        callcontrol       = callcontrol " Control of the F4 process
      EXCEPTIONS
        parameter_unknown = 1           " No suitable parameter of the search help
        OTHERS            = 2.
    IF sy-subrc > 0.
      RETURN.
    ELSE.
      CALL FUNCTION 'F4UT_PARAMETER_RESULTS_PUT'
        EXPORTING
          parameter         = 'TEXT'
          fieldname         = 'TEXT'         " Name of the source field in SOURCE_TAB
        TABLES
          shlp_tab          = shlp_tab    " Table of Elementary Search Helps
          record_tab        = record_tab  " Hit list
          source_tab        = values
        CHANGING
          shlp              = shlp        " Single (Current) Search Help
          callcontrol       = callcontrol " Control of the F4 process
        EXCEPTIONS
          parameter_unknown = 1           " No suitable parameter of the search help
          OTHERS            = 2.
      IF sy-subrc > 0.
        RETURN.
      ENDIF.

      callcontrol-step = 'DISPLAY'.
    ENDIF.
  ENDIF.


ENDFUNCTION.

Definition der Suchhilfe

Nun musst du noch die Suchhilfe definieren, in der du die Parameter der Suchhilfe definierst und die Datenbeschaffung über den Suchhilfe-Exit steuerst.

Den Suchhilfe-Exit legst du in Transaktion SE11 an. Aktiviere die Option Vorschlagssuche auf Eingabefeldern. Trage den Namen des Funktionsbausteins in das Feld Suchhilfe-Exit ein und definiere die Parameter:

Suchhilfe ZDYNFUZZ

Verwendung im Programm

Sobald du die Suchhilfe angelegt hast, kannst du sie im Programm verwenden, indem du diese zur Verwendung im Feld angibst:

PARAMETERS p_val TYPE text40 MATCHCODE OBJECT zdynfuzz.

Bei Initialisierung ermitteln wir die möglichen Werte und schreiben sie ins SAP-Memory. Das war auch schon alles.

REPORT.

PARAMETERS p_val TYPE text40 MATCHCODE OBJECT zdynfuzz.


INITIALIZATION.

  TYPES: BEGIN OF ts_value,
           line TYPE text40,
           text type text40,
         END OF ts_value.
  DATA gt_values TYPE STANDARD TABLE OF ts_value WITH EMPTY KEY.

  gt_values = VALUE #(
    ( line = 'Berlin'            text = 'Berlin' )
    ( line = 'Hamburg'           text = 'Hamburg' )
    ( line = 'München'           text = 'Bayern' )
    ( line = 'Köln'              text = 'Nordrhein-Westfalen' )
    ( line = 'Frankfurt am Main' text = 'Hessen' )
    ( line = 'Stuttgart'         text = 'Baden-Württemberg' )
    ( line = 'Düsseldorf'        text = 'Nordrhein-Westfalen' )
    ( line = 'Leipzig'           text = 'Sachsen' )
    ( line = 'Dortmund'          text = 'Nordrhein-Westfalen' )
    ( line = 'Essen'             text = 'Nordrhein-Westfalen' )
    ( line = 'Bremen'            text = 'Bremen' )
    ( line = 'Dresden'           text = 'Sachsen' )
    ( line = 'Hannover'          text = 'Niedersachsen' )
    ( line = 'Nürnberg'          text = 'Bayern' )
    ( line = 'Duisburg'          text = 'Nordrhein-Westfalen' )
    ( line = 'Bochum'            text = 'Nordrhein-Westfalen' )
    ( line = 'Wuppertal'         text = 'Nordrhein-Westfalen' )
    ( line = 'Bielefeld'         text = 'Nordrhein-Westfalen' )
    ( line = 'Bonn'              text = 'Nordrhein-Westfalen' )
    ( line = 'Münster'           text = 'Nordrhein-Westfalen' )
    ( line = 'Karlsruhe'         text = 'Baden-Württemberg' )
    ( line = 'Mannheim'          text = 'Baden-Württemberg' )
    ( line = 'Augsburg'          text = 'Bayern' )
    ( line = 'Wiesbaden'         text = 'Hessen' )
    ( line = 'Mönchengladbach'   text = 'Nordrhein-Westfalen' )
    ( line = 'Gelsenkirchen'     text = 'Nordrhein-Westfalen' )
    ( line = 'Braunschweig'      text = 'Niedersachsen' )
    ( line = 'Aachen'            text = 'Nordrhein-Westfalen' )
    ( line = 'Kiel'              text = 'Schleswig-Holstein' )
    ( line = 'Chemnitz'          text = 'Sachsen' ) ).


  EXPORT values FROM gt_values TO MEMORY ID 'Trcktrsr'.

Ergebnis

Nun bekommt der Anwender alle Werte direkt angezeigt, die zur bereits getätigten Eingabe passen:

Aktiviert Vorschlagssuche

Die Einträge können mit den Pfeiltasten direkt ausgewählt werden.

Enno Wulff